﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace Szabalyrendszer
{
    public class SebzesSzamolo
    {
        private OpcionalisSzabalySzamolo opcionalisSzabalySzamolo;

        public OpcionalisSzabalySzamolo OpcionalisSzabalyok
        {
            get { return opcionalisSzabalySzamolo ?? (opcionalisSzabalySzamolo = new OpcionalisSzabalySzamolo()); }
            set { opcionalisSzabalySzamolo = value; }
        }

        public Seb AlapSebzes(int kidobottSebzes, SebzesTipus sebzesTipus, bool tulutes, bool harcAzEllenfelElfogasaert)
        {
            Seb seb = new Seb();

            if (!tulutes)
            {
                switch (sebzesTipus)
                {
                    case SebzesTipus.Fegyver:
                        seb.Fp += kidobottSebzes;
                        seb.Ep += OpcionalisSzabalyok.KotelezoEpSzamolas(kidobottSebzes);
                        break;
                    case SebzesTipus.Villam:
                        seb.Fp += kidobottSebzes;
                        break;
                    case SebzesTipus.ElemiTuz:
                        seb.Fp += kidobottSebzes;
                        seb.Ep += OpcionalisSzabalyok.KotelezoEpSzamolas(kidobottSebzes);
                        break;
                    case SebzesTipus.ElemiViz:
                    case SebzesTipus.ElemiFold:
                    case SebzesTipus.ElemiLeg:
                        break;
                    case SebzesTipus.Mereg:
                        seb.Fp += kidobottSebzes;
                        break;
                    default:
                        throw new ArgumentOutOfRangeException("sebzesTipus");
                }
            }
            else
            {
                switch (sebzesTipus)
                {
                    case SebzesTipus.Fegyver:
                        seb.Ep = !harcAzEllenfelElfogasaert ? kidobottSebzes : 0;
                        seb.Fp = kidobottSebzes * 2;
                        break;
                    case SebzesTipus.Villam:
                        seb.Fp = kidobottSebzes;
                        break;
                    case SebzesTipus.ElemiTuz:
                        seb.Fp = kidobottSebzes;
                        seb.Ep = OpcionalisSzabalyok.KotelezoEpSzamolas(kidobottSebzes);
                        break;
                    case SebzesTipus.ElemiViz:
                    case SebzesTipus.ElemiFold:
                    case SebzesTipus.ElemiLeg:
                        break;
                    case SebzesTipus.Mereg:
                        seb.Fp = kidobottSebzes;
                        break;
                    default:
                        throw new ArgumentOutOfRangeException("sebzesTipus");
                }
            }

            return seb;
        }

        public Seb SebzesSzamolas(bool tulutes, List<KidobottSebzes> kidobottSebzes, int pusztitasKidobottSebzes, bool harcAzEllenfelElfogasaert, int nullaNulla, int maradekFp)
        {
            Seb seb = new Seb();

            seb = kidobottSebzes.Aggregate(seb, (current, sebzes) => current + AlapSebzes(sebzes.Ertek, sebzes.SebzesTipus, tulutes, harcAzEllenfelElfogasaert));

            seb.Ep += tulutes && !harcAzEllenfelElfogasaert ? pusztitasKidobottSebzes : 0;
            seb.Fp += tulutes && !harcAzEllenfelElfogasaert ? pusztitasKidobottSebzes*2 : 0;

            seb.Ep += nullaNulla;
            seb.Fp += nullaNulla + nullaNulla;
            
            if (harcAzEllenfelElfogasaert && seb.Ep > 0)
            {
                seb.Ep = 0;
            }

            seb.Ep = OpcionalisSzabalyok.KotelezoEpSzamolas(seb.Fp);

            if (seb.Fp > maradekFp)
            {
                seb.Ep += seb.Fp - maradekFp;
                seb.Fp = maradekFp;
            }

            return seb;
        }

    }
}
